home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994 …ember: Reference Library / Dev.CD Dec 94.toast / Technical Documentation / QuickTime Documentation / Using the TimeCode Media / Using the TimeCode Media
Encoding:
Text File  |  1994-10-20  |  27.1 KB  |  50 lines  |  [ONLN/HLX2]

  1. TimeCode Media HandlerThe TimeCode Media Handler provides a way to store time code in a QuickTime movie. This media supports SMPTE time code. Typically, an application will add a timecode track when a movie is captured. Since the time code is maintained during Movie editing, it can be queried later to produce an edit list.TimeCode TrackThe information stored in the TimeCode track consists of source identification information (eg. name of the source tape), format information (eg. 29.97 fps, dropframe, etc), and frame numbers (ie. translates into time code given the format information).  In a perfect world, you only need to record the time code information for the first frame of a captured movie.  Let’s say that the first frame is at time 00:02:13:15 (HH:MM:SS:FF). You record this as a sample in the time code track and this sample lasts for the duration of the movie. Then you can determine the time code for every frame in the movie. In the real world, you may encounter discontinous time code. In this case, you would add another time code sample whenever the discontinuity occurs.Since the duration of a sample is specified when it is added to a track, you must know the duration the time code is for.  You have to add the time code sample after you know how long it is good for.Source IdentificationThe source identification information is stored in the TimeCodeDescription. This information is stored as UserData identifying the source material. Use the Movie Toolbox UserData routines to extract and add this information. Use the ‘name’ type to specify the name of the source material as UserDataText. Other information about the source may be stored here in the future. See the “Working With Movie User Data” section inside Chapter 2 of Inside Macintosh QuickTime.struct TimeCodeDescription {    // standard sample description header    long                descSize;    long                dataFormat;    long                resvd1;    short                resvd2;    short                dataRefIndex;    // timecode specific stuff    long                flags;    TimeCodeDef            timeCodeDef;    UserDataAtom        srcRef;};The TimeCodeDef structure defines the format of the the time code that was added to the TimeCode track.  struct TimeCodeDef {    long            flags;        TimeScale        fTimeScale;        TimeValue        frameDuration;    unsigned char    numFrames;};enum {    tcDropFrame = 1<<0,    tc24HourMax = 1<<1,    tcNegTimesOK = 1<<2,    tcCounter = 1<<3};The tcDropFrame bit in the flags field defines whether the time code was drop frame. The tc24HourMax bit specifies whether the time code wraps at 24 hours (eg. SMPTE). The tcNegTimesOK specifies that negative values are allowed (eg. -00:01:20:15). The tcCounter specifies that the time is a counter position of a tape.The fTimeScale field of TimeCodeDef is the time scale for interpreting frameDuration.  FrameDuration is how long each frame lasts in real time.  NumFrames is the number of frames per second for the timecode format.  If the time is a counter, this is the number of frames per tick for each counter tick.For SMPTE NTSC 29.97 frames-per-second drop-frame, a TimeCodeDef would be:TimeCodeDef.flags = tcDropFrame | tc24HourMax;    TimeCodeDef.fTimeScale= 2997;    TimeCodeDef.frameDuration= 100;TimeCodeDef.numFrames= 30;The sample data is the frame number from time zero. For example, if the time code for the material is at 00:00:12:15 for the above TimeCodeDef, the frame number is 12*30+15 = 375. In other words, the beginning of the movie is frame number 375 which is the same as 00:00:12:15 when converted using the previous TimeCodeDef. The TimeCode Media Handler provides routines for doing all the conversions necessary. The sample data is just a long.Since the original TimeCodeDef is stored, you can readily use the same time code format as the original material. You can also interpret it in another form if you desire.When frame numbers are converted to and from time code using the TimeCodeDef, the time code is expressed using the TimeCodeRecord.struct TimeCodeTime {    unsigned char    hours;    Boolean        isNegative:1;    unsigned char    minutes:7;    unsigned char    seconds;    unsigned char    frames;};struct TimeCodeCounter {    long counter;};union TimeCodeRecord{    TimeCodeTime    t;    TimeCodeCounter    c;};Note:  The interfaces do not define isNegative and minutes as bit fields for portability reasons. Instead, mask the minutes field with tctNegFlag to determine whether the time code is negative.  TimeCodeRecordAs you can see, the TimeCodeRecord handles both time code and counter values. When you directly access a TimeCodeRecord as a TimeCodeTime, it is important to check the negative bit. The TimeCode Media Handler provides routines for converting frameNumbers to and from TimeCodeRecords.When a TimeCode track is added to a movie, it is vital to indicate which tracks this time code is for. You do this using the new track reference routines (see documention for this elsewhere). Study the code samples closely for adding to and extracting time codes from a movie. The AddTimeCode sample lets you add timecode to a movie. The ExportCMX3600 sample is a QuickTime Movie Export Component which creates a CMX3600 EDL for a Movie with TimeCode.You can have the time code displayed in the Movie. When displayed, the time code appears in the Track’s rectangle. You must enable the track as well as call TCSetTimeCodeFlags. To turn off the display, disable the track and call TCSetTimeCodeFlags.Callspascal HandlerError TCGetCurrentTimeCode( MediaHandler mh,     long *frameNum, TimeCodeDef *tcdef,     TimeCodeRecord *tcrec, UserData *srcRef);This call returns all the information about the TimeCode for the current time in the movie. It returns the frameNumber, the TimeCodeDef, the TimeCodeRecord interpreting the frameNumber using the TimeCodeDef, and the SourceReference. If there are any pieces of information you do not need, just pass nil. If you get a srcRef, don’t forget to call DisposeUserData after you are finished with it.pascal HandlerError TCGetTimeCodeAtTime( MediaHandler mh,     const TimeValue mediaTime, long *frameNum,     TimeCodeDef *tcdef, TimeCodeRecord *tcdata,     UserData *srcRef );This call returns all the information about the TimeCode at a given time in the media. It returns the frameNumber, the TimeCodeDef, the TimeCodeRecord interpreting the frameNumber using the TimeCodeDef, and the SourceReference. If there are any pieces of information you do not need, just pass nil. If you get a srcRef, don’t forget to call DisposeUserData after you are finished with it.pascal HandlerError TCTimeCodeToFrameNumber( MediaHandler mh,     TimeCodeDef *tcdef, TimeCodeRecord *tcrec,     long *frameNumber )This call converts the TimeCodeRecord into a frameNumber using the TimeCodeDef. pascal HandlerError TCFrameNumberToTimeCode( MediaHandler mh,     long frameNumber, TimeCodeDef *tcdef,     TimeCodeRecord *tcrec )This call converts the frameNumber  into a TimeCodeRecord using the TimeCodeDef. pascal HandlerError TCTimeCodeToString( MediaHandler mh,     const TimeCodeDef *tcdef, const TimeCodeRecord *tcrec, StringPtr tcStr )This call creates a string for the TimeCodeRecord using the TimeCodeDef. If the time code is drop-frame, the separators are ‘;’ instead of ‘:’. pascal HandlerError TCGetSourceRef( MediaHandler mh, const TimeCodeDescriptionHandle tcdH, UserData *srefH )This call returns the SourceRefence from the TimeCodeDescription. After you are done with srefH, don’t forget to call DisposeUserData on it. pascal HandlerError TCSetSourceRef( MediaHandler mh, TimeCodeDescriptionHandle tcdH,     UserData srefH )This call puts srefH into the TimeCodeDescription. pascal HandlerError TCSetTimeCodeFlags( MediaHandler mh,     long flags, long flagsMask )This call sets flags for the TimeCode media. Currently the only flag is whether to display the time code in the movie. pascal HandlerError TCGetTimeCodeFlags( MediaHandler mh,     long *flags )This call returns the flags for the TimeCode media. Currently the only flag is whether to display the time code in the movie. pascal HandlerError TCSetDisplayOptions( MediaHandler mh,     const TCTextOptionsPtr textOptions )This call sets the display options for the TimeCode media. If the time code is displayed in the movie, these options control its characteristics.  The TCTextOptions defines the text characteristics used when timecode is displayed. struct TCTextOptions {    short        txFont;    short        txFace;    short        txSize;    RGBColor    foreColor;    RGBColor    backColor;};pascal HandlerError TCGetDisplayOptions( MediaHandler mh, TCTextOptionsPtr textOptions )This call returns the display options for the TimeCode media. If the time code is displayed in the movie, these options control its characteristics. Ó◊#ˇ ˇˇˇˇ#◊ 
  2. d, Palatino.°dONLNd)õ=ç+πWTimeCode Media Handler °dONLNdY<gπ(ÇZAThe TimeCode Media Handler provides a way to store time code in a°dONLNdYg<uÃ*CQuickTime movie. This media supports SMPTE time code. Typically, an°dONLNdùu<É”*Iapplication will add a timecode track when a movie is captured. Since the°dONLNdÁÉ<ë«*Htime code is maintained during Movie editing, it can be queried later to°dONLNd0ë<ü©*produce an edit list.°dONLNdF≠<ªò*TimeCode Track°dONLNdU¿<Œ°*?The information stored in the TimeCode track consists of source°dONLNdïŒ<‹‰*Lidentification information (eg. name of the source tape), format information°dONLNd‚‹<Í—*L(eg. 29.97 fps, dropframe, etc), and frame numbers (ie. translates into time°dONLNd/Í<¯œ*Icode given the format information).  In a perfect world, you only need to°dONLNdy¯<œ*Irecord the time code information for the first frame of a captured movie.°dONLNdƒ<Â*OLet’s say that the first frame is at time 00:02:13:15 (HH:MM:SS:FF). You record°dONLNd<"‡*Nthis as a sample in the time code track and this sample lasts for the duration°dONLNdc"<0fi*Iof the movie. Then you can determine the time code for every frame in the°dONLNd≠0<>‰*Kmovie. In the real world, you may encounter discontinous time code. In this°dONLNd˘><L‹*Gcase, you would add another time code sample whenever the discontinuity°dONLNdAL<Zb*occurs.°dONLNdIh<v“*LSince the duration of a sample is specified when it is added to a track, you°dONLNdñv<щ*Kmust know the duration the time code is for.  You have to add the time code°dONLNd‚Ñ<í>*.sample after you know how long it is good for.°dONLNd†<Æ∞*Source Identification°dONLNd'≥<¡d*6The source identification information is stored in the,
  3. Courier°dONLNd^¡<Õ¡*TimeCodeDescription°dONLNdq¡¡œ›)Ö4. This information is stored as UserData identifying°dONLNd¶œ<›‰(¯ZKthe source material. Use the Movie Toolbox UserData routines to extract and°dONLNdÚ›<΀*Kadd this information. Use the ‘name’ type to specify the name of the source°dONLNd>Î<˘|* material as °dONLNdJÎ|˜–)@ UserDataText°dONLNdVΖ˘Î)T2. Other information about the source may be stored°dONLNdâ˘<‡("ZIhere in the future. See the “Working With Movie User Data” section inside°dONLNd”<'*(Chapter 2 of Inside Macintosh QuickTime.
  4. °dONLNd¸#[/+struct TimeCodeDescription {°dONLNd.Ñ:b+) %// standard sample description header°dONLNdA9ÑEú* long°dONLNdI9EJ)ê    descSize;°dONLNdTDÑPú(l¢long°dONLNd\DPV)ê dataFormat;°dONLNdiOÑ[ú(w¢long°dONLNdqO[>)êresvd1;°dONLNdzZÑf¢(Ç¢short°dONLNdÉZf>)êresvd2;°dONLNdåeÑq¢(ç¢short°dONLNdïeqb)êdataRefIndex;°dONLNd§{Ñá (£¢// timecode specific stuff°dONLNd¿ÜÑíú* long°dONLNd»Üí8)êflags;°dONLNd–ëÑùΔ(π¢ TimeCodeDef°dONLNdfiëù\)ê timeCodeDef;°dONLNdÏúÑ®Ã(ƒ¢ UserDataAtom°dONLNd˙ú®>)êsrcRef; (–QT2.0 TimeCode Media Handler - )æ1ˇx◊#ˇ ˇˇˇˇ#◊ 
  5. d,
  6. Courier
  7. .°dONLNd)[5g+yQ};, Palatino °dONLNdB<PU(kZThe °dONLNdBUN¢) TimeCodeDef°dONLNdB¢P‚)M; structure defines the format of the the time code that was°dONLNdNP<^É(yZadded to the °dONLNd[PÉ\ª)GTimeCode°dONLNdcPª^‹)8 track.
  8. °dONLNdml[x”(îystruct TimeCodeDef {°dONLNdÉwÑÉú+) long°dONLNdäwÉ)lflags;°dONLNdìÇÑé∫(™¢    TimeScale°dONLNdûÇé2)l fTimeScale;°dONLNd¨çÑô∫(µ¢    TimeValue°dONLNd∑çôD)lframeDuration;°dONLNd«òѧ“(¿¢unsigned char°dONLNd’ò§,)l
  9. numFrames;°dONLNd‡£[Øg(Ày};°dONLNd„º[»*enum {°dONLNdΫєˆ+) tcDropFrame = 1<<0,°dONLNd“Ñfiˆ* tc24HourMax = 1<<1,°dONLNd›Ñȸ* tcNegTimesOK = 1<<2,°dONLNd+ËÑÙ‰* tcCounter = 1<<3°dONLNd<Û[ˇg(y}; °dONLNd? <U(5ZThe °dONLNdC U¢) tcDropFrame°dONLNdN ¢“)M9 bit in the flags field defines whether the time code was°dONLNdà<(ô(CZdrop frame. The °dONLNdòô&Ê)] tc24HourMax°dONLNd£Ê(Ë)M0 bit specifies whether the time code wraps at 24°dONLNd‘(<6¬(QZhours (eg. SMPTE). The °dONLNdÎ(¬4)Ü tcNegTimesOK°dONLNd˜(6œ)T# specifies that negative values are°dONLNd6<D·(_Z allowed (eg. -00:01:20:15). The °dONLNd;6·B )•    tcCounter°dONLNdD6 Dfl)?% specifies that the time is a counter°dONLNdjD<Rû(mZposition of a tape.°dONLNd~`<nU*The °dONLNdÇ`Ulõ)
  10. fTimeScale°dONLNdå`õn»)F
  11.  field of °dONLNdñ`»l)- TimeCodeDef°dONLNd°`n…)M# is the time scale for interpreting°dONLNd≈n<zó(óZframeDuration°dONLNd“nó|†)[.  °dONLNd’n†z˚)    FrameDuration°dONLNd‚n˚|·)[+ is how long each frame lasts in real time.°dONLNd|<ä‚(•ZINumFrames is the number of frames per second for the timecode format.  If°dONLNdYä<ò⁄*Mthe time is a counter, this is the number of frames per tick for each counter°dONLNdßò<¶S*tick.°dONLNd≠¥<¬x*5For SMPTE NTSC 29.97 frames-per-second drop-frame, a °dONLNd‚¥x¿≈(›ñ TimeCodeDef°dONLNdÌ¥≈¬Ï)M would°dONLNdÙ¬<–K(ÎZbe:
  12. °dONLNd¯–[‹o+.TimeCodeDef.flags = tcDropFrame | tc24HourMax;°dONLNd(€[Á    * TimeCodeDef.fTimeScale= 2997;°dONLNdGÊ[Ú* TimeCodeDef.frameDuration= 100;°dONLNdgÒ[˝˜* TimeCodeDef.numFrames= 30; °dONLNdÇ
  13. <—(3ZGThe sample data is the frame number from time zero. For example, if the°dONLNd <&p*;time code for the material is at 00:00:12:15 for the above °dONLNdp$Ω(Aé TimeCodeDef°dONLNdΩ&’)M, the°dONLNd&<4„(OZJframe number is 12*30+15 = 375. In other words, the beginning of the movie°dONLNda4<Bfl*Iis frame number 375 which is the same as 00:00:12:15 when converted using°dONLNd´B<PÜ*the previous °dONLNd∏BÜN”)J TimeCodeDef°dONLNd√B”PÈ)M.. The TimeCode Media Handler provides routines°dONLNdÚP<^¿(yZHfor doing all the conversions necessary. The sample data is just a long.°dONLNd;l<z°*Since the original °dONLNdNl°xÓ)e TimeCodeDef°dONLNdYlÓz·)M- is stored, you can readily use the same time°dONLNdáz<àÍ(£ZOcode format as the original material. You can also interpret it in another form°dONLNd◊à<ñÉ*if you desire.+v?QT2.0 TimeCode Media Handler - )æ2ˇƒ◊#ˇ ˇˇˇˇ#◊ 
  14. d, Palatino .°dONLNd)<7Ω+ZR@When frame numbers are converted to and from time code using the,
  15. Courier°dONLNdA7<Câ* TimeCodeDef°dONLNdL7âEX)M', the time code is expressed using the °dONLNds7XC∫)œTimeCodeRecord°dONLNdÅ7∫EΩ)b.
  16. °dONLNdÉS[_Ÿ({ystruct TimeCodeTime {°dONLNdö^Ñj“+) unsigned char°dONLNd®^j)lhours;°dONLNd∞iÑuÆ(ë¢Boolean°dONLNdπiu>)lisNegative:1;°dONLNd»tÑÄ“(ú¢unsigned char°dONLNd÷tÄ,)l
  17. minutes:7;°dONLNd‚Ñã“(ߢunsigned char°dONLNdã )lseconds;°dONLNd˙äÑñ“(≤¢unsigned char°dONLNdäñ)lframes;°dONLNdï[°g(Ωy};°dONLNd†[¨Î* struct TimeCodeCounter {°dONLNd-´Ñ∑“+) long counter;°dONLNd;∂[¬g(fiy};°dONLNd>¡[ÕŸ* union TimeCodeRecord{°dONLNdUÃÑÿÃ+) TimeCodeTime°dONLNdbÃÿ¸)lt;°dONLNdf◊Ñ„fi(ˇ¢TimeCodeCounter°dONLNdv◊„¸)lc;°dONLNdy‚[Óg(
  18. y}; °dONLNd|˚<    ˇ($Z$Note:  The interfaces do not define °dONLNd†˚ˇE)√
  19. isNegative°dONLNd™˚E    `)F and °dONLNdØ˚`ë)minutes°dONLNd∂˚ë    ‰)1 as bit fields for°dONLNd…    < (2Z'portability reasons. Instead, mask the °dONLNd     =)–minutes°dONLNd˜    =y)1  field with °dONLNd    yø)<
  20. tctNegFlag°dONLNd    øÕ)F to°dONLNd<%8(@Z,determine whether the time code is negative.°dONLNd@3<Aù*TimeCodeRecord°dONLNdOF<T®*As you can see, the °dONLNdcF®R
  21. )lTimeCodeRecord°dONLNdqF
  22. T‘)b# handles both time code and counter°dONLNdïT<b˛(}Z#values. When you directly access a °dONLNd∏T˛``)¬TimeCodeRecord°dONLNdΔT`bz)b as a °dONLNdÃTz`Œ) TimeCodeTime°dONLNdÿTŒbË)T, it is°dONLNd‡b<p(ãZ)important to check the negative bit. The °dONLNd    bnU)·TimeCode°dONLNdbUp‡)8 Media Handler provides°dONLNd)p<~¡(ôZroutines for converting °dONLNdAp¡|)Ö frameNumbers°dONLNdMp~])T to and from °dONLNdZp]|Δ)HTimeCodeRecords°dONLNdipΔ~…)i.°dONLNdkå<öl(µZWhen a °dONLNdrålò§)0TimeCode°dONLNdzå§öÀ)89 track is added to a movie, it is vital to indicate which°dONLNd¥ö<®Í(√ZPtracks this time code is for. You do this using the new track reference routines°dONLNd®<∂Ã*H(see documention for this elsewhere). Study the code samples closely for°dONLNdN∂<ƒn*6adding to and extracting time codes from a movie. The °dONLNdÑ∂n¬ª(flå AddTimeCode°dONLNdè∂ªƒÊ)M sample°dONLNdóƒ<“(ÌZ&lets you add timecode to a movie. The °dONLNdΩƒ–m)÷ExportCMX3600°dONLNd ƒm“≠)[  sample is a°dONLNd◊“<‡‘(˚ZBQuickTime Movie Export Component which creates a CMX3600 EDL for a°dONLNd‡<Óæ*Movie with TimeCode.°dONLNd/¸<
  23. “*FYou can have the time code displayed in the Movie. When displayed, the°dONLNdv
  24. <‚*Mtime code appears in the Track’s rectangle. You must enable the track as well°dONLNdƒ<&Ê*Oas call TCSetTimeCodeFlags. To turn off the display, disable the track and call°dONLNd&<4∂*TCSetTimeCodeFlags.°dONLNd(^n$+«:Calls
  25. °dONLNd.~[ä∑(¶y:pascal HandlerError TCGetCurrentTimeCode( MediaHandler mh,°dONLNdkâÑïV+) #long *frameNum, TimeCodeDef *tcdef,°dONLNdëîцz* )TimeCodeRecord *tcrec, UserData *srcRef); +.4QT2.0 TimeCode Media Handler - )æ3ˇ(◊#ˇ ˇˇˇˇ#◊ 
  26. d, Palatino .°dONLNd7<E?+Z`0This call returns all the information about the ,
  27. Courier°dONLNd07?Cw(`]TimeCode°dONLNd87wEË)8 for the current time°dONLNdNE<S◊(nZin the movie. It returns the °dONLNdkE◊Q$)õ frameNumber°dONLNdvE$S?)M, the °dONLNd|E?Qå) TimeCodeDef°dONLNdáEåS§)M, the°dONLNdçS<_û(|ZTimeCodeRecord°dONLNdõSûa¸)b interpreting the °dONLNd≠S¸_I)^ frameNumber°dONLNd∏SIaÎ)M using the TimeCodeDef, and°dONLNd‘a<oQ(äZthe °dONLNdÿaQm∫)SourceReference°dONLNdÁa∫oÃ)i3. If there are any pieces of information you do not°dONLNdo<}‰(òZ"need, just pass nil. If you get a °dONLNd=o‰{)®srcRef°dONLNdCo}{)*, don’t forget to call °dONLNdZo{{‰)mDisposeUserData°dONLNdj}<ã›(¶Zafter you are finished with it.
  28. °dONLNdäô[•±+pascal HandlerError TCGetTimeCodeAtTime( MediaHandler mh,°dONLNdΔ§Ñ∞Ä+) *const TimeValue mediaTime, long *frameNum,°dONLNd󯄻Ü* +TimeCodeDef *tcdef, TimeCodeRecord *tcdata,°dONLNd!∫ÑΔˆ* UserData *srcRef ); °dONLNd5”<·?(¸Z0This call returns all the information about the °dONLNde”?flw(¸]TimeCode°dONLNdm”w·‹)8 at a given time in°dONLNdÅ·<ÔΔ(
  29. Zthe media. It returns the °dONLNdõ·ΔÌ)ä frameNumber°dONLNd¶·Ô.)M, the °dONLNd¨·.Ì{) TimeCodeDef°dONLNd∑·{Ôì)M, the°dONLNdΩÔ<˚û(ZTimeCodeRecord°dONLNdÀÔû˝¸)b interpreting the °dONLNd›Ô¸˚I)^ frameNumber°dONLNdËÔI˝É)M  using the °dONLNdÛÔÉ˚–): TimeCodeDef°dONLNd˛Ô–˝Î)M, and°dONLNd˝< Q(&Zthe °dONLNd˝Q    ∫)SourceReference°dONLNd˝∫ Ã)i3. If there are any pieces of information you do not°dONLNdK <‰(4Z"need, just pass nil. If you get a °dONLNdm ‰)®srcRef°dONLNds {)*, don’t forget to call °dONLNdä {‰)mDisposeUserData°dONLNdö<'›(BZafter you are finished with it.
  30. °dONLNd∫5[A…+=pascal HandlerError TCTimeCodeToFrameNumber( MediaHandler mh,°dONLNd˙@ÑLÄ+) *TimeCodeDef *tcdef, TimeCodeRecord *tcrec,°dONLNd'KÑWˆ* long *frameNumber ) °dONLNd;d<r∂(çZThis call converts the °dONLNdRd∂p)zTimeCodeRecord°dONLNd`dr>)b into a °dONLNdhd>pã)& frameNumber°dONLNdsdãr¬)M
  31.  using the°dONLNd~r<~â(õZ TimeCodeDef°dONLNdârâÄå)M.
  32. °dONLNdçé[ö…(∂y=pascal HandlerError TCFrameNumberToTimeCode( MediaHandler mh,°dONLNdÕôÑ•b+) %long frameNumber, TimeCodeDef *tcdef,°dONLNdı§Ñ∞* TimeCodeRecord *tcrec ) °dONLNdΩ<À∂(ÊZThis call converts the °dONLNd$Ω∂…)z frameNumber°dONLNd/ΩÀ,)M      into a °dONLNd8Ω,…é))TimeCodeRecord°dONLNdFΩéÀ≈)b
  33.  using the°dONLNdQÀ<◊â(ÙZ TimeCodeDef°dONLNd\ÀâŸå)M.
  34. °dONLNd`Á[Û´(y8pascal HandlerError TCTimeCodeToString( MediaHandler mh,°dONLNdõÚÑ˛»+) 6const TimeCodeDef *tcdef, const TimeCodeRecord *tcrec,°dONLNd“˝Ñ    Í* StringPtr tcStr ) °dONLNd‰<$Í(?Z#This call creates a string for the °dONLNdÍ"L)ÆTimeCodeRecord°dONLNdL$Ü)b  using the °dONLNd Ü"”): TimeCodeDef°dONLNd+”$·)M. If°dONLNd0$<2ê(MZCthe time code is drop-frame, the separators are ‘;’ instead of ‘:’.
  35. °dONLNdv@[L∑+:pascal HandlerError TCGetSourceRef( MediaHandler mh, const°dONLNd±KÑW™+) 1TimeCodeDescriptionHandle tcdH, UserData *srefH ) °dONLNd„d<rØ(çZThis call returns the °dONLNd˘dØp
  36. )sSourceRefence°dONLNdd
  37. rA)[
  38.  from the °dONLNddApΔ)7TimeCodeDescription°dONLNd#dΔrÈ)Ö. After°dONLNd+r<ħ(õZyou are done with °dONLNd=r§~«)hsrefH°dONLNdBr«Ä4)#, don’t forget to call °dONLNdYr4~ù)mDisposeUserData°dONLNdhrùÄΩ)i on it.
  39. °dONLNdré[öì(∂y4pascal HandlerError TCSetSourceRef( MediaHandler mh,°dONLNdßôÑ•>+) TimeCodeDescriptionHandle tcdH,°dONLNd…§Ñ∞‰* UserData srefH ) +.$QT2.0 TimeCode Media Handler - )æ4ˇ
  40. ◊#ˇ ˇˇˇˇ#◊ 
  41. d, Palatino .°dONLNd7<Eâ+Z`This call puts ,
  42. Courier°dONLNd7âC¨)MsrefH°dONLNd7¨Efi)#
  43.  into the °dONLNd7fiCc)2TimeCodeDescription°dONLNd17cEf)Ö.
  44. °dONLNd5S[_´({y8pascal HandlerError TCSetTimeCodeFlags( MediaHandler mh,°dONLNdp^Ñj,+) long flags, long flagsMask ) °dONLNdçw<Ö…(†ZThis call sets flags for the °dONLNd™w…É)çTimeCode°dONLNd≤wÖÈ)8* media. Currently the only flag is whether°dONLNd›Ö<ì(ÆZ&to display the time code in the movie.
  45. °dONLNd°[≠´+pascal HandlerError TCGetTimeCodeFlags( MediaHandler mh,°dONLNdA¨Ñ∏“+) long *flags ) °dONLNdO≈<”Û(ÓZ$This call returns the flags for the °dONLNds≈Û—+)∑TimeCode°dONLNd{≈+”·)8" media. Currently the only flag is°dONLNdû”<·@(¸Z.whether to display the time code in the movie.
  46. °dONLNdœÔ[˚±+pascal HandlerError TCSetDisplayOptions( MediaHandler mh,°dONLNd ˙Ñ\+) $const TCTextOptionsPtr textOptions ) °dONLNd0<!(<Z+This call sets the display options for the °dONLNd[Q)›TimeCode°dONLNdcQ!fl)8 media. If the time code is°dONLNd!</∂(JZGdisplayed in the movie, these options control its characteristics.  The°dONLNd«/<;ó*TCTextOptions°dONLNd‘/ó=¿)[7 defines the text characteristics used when timecode is°dONLNd =<Ks(fZ
  47. displayed.
  48. °dONLNdY[eÂ+ struct TCTextOptions {°dONLNd0dÑp¢+) short°dONLNd7dÃpˆ)HtxFont;°dONLNd@oÑ{¢(ó¢short°dONLNdGoÃ{ˆ)HtxFace;°dONLNdPzÑÜ¢(¢¢short°dONLNdWzÃ܈)HtxSize;°dONLNd`ÖÑë¥(≠¢RGBColor°dONLNdiÖÃë)H
  49. foreColor;°dONLNduêÑú¥(∏¢RGBColor°dONLNd~êÃú)H
  50. backColor;°dONLNdâõ[ßg(√y};°dONLNdå¥[¿±*9pascal HandlerError TCGetDisplayOptions( MediaHandler mh,°dONLNdΔøÑÀ8+) TCTextOptionsPtr textOptions ) °dONLNdÂÿ<Ê.(Z.This call returns the display options for the °dONLNdÿ.‰f)ÚTimeCode°dONLNdÿfÊË)8 media. If the time code°dONLNd4Ê<Ù¶(ZEis displayed in the movie, these options control its characteristics.+v·QT2.0 TimeCode Media Handler - )æ5ˇ